//#include<iostream>
//using namespace std;
//int main()
//{
//	int n, m;
//	cin >> n >> m;
//	long long sum = 0;
//	long long maxapple = 0;
//	int num = 1;
//	int maxi = 0;
//	int sz = m;
//	while (n--)
//	{
//		int pre = 0;
//		cin >> pre;
//		int i = 0;
//		int dep = 0;
//		sum += pre;
//		for(i; i < sz; i++)
//		{
//			long long k;
//			cin >> k;		
//			if (k + dep + pre <= 0)
//			{
//				dep = -pre;
//				continue;
//			}
//			dep += k;
//		}
//		if (dep < maxapple)
//		{
//			 maxapple=dep;
//			maxi = num;
//		}
//		num++;
//		sum += dep;
//	}
//	cout << sum  << ' ' << maxi << ' ' << -maxapple;
//}
//#include<iostream>
//#include<vector>
//using namespace std;
//int main()
//{
//	int n;
//	cin >> n;
//	long long sum = 0;
//	long long treenumber = 0;
//	int num = 1;
//	vector<int> v;
//	v.resize(2 * n, 0);
//	int tree = 0;
//	while (n--)
//	{
//		int m = 0;
//		cin >> m;
//		int pre = 0;
//		cin >> pre;
//		int i = 0;
//		int flag = 1;
//		for (i; i < m - 1; i++)
//		{		
//			long long k;
//			cin >> k;
//			if (k > 0)
//			{
//				if (k != pre)
//				{
//					pre = k;
//					if (flag)
//					{
//						tree++;
//						flag = 0;
//						v[num - 1] = 1;
//						v[v.size() / 2 + num - 1] = 1;
//					}
//				}
//				
//			}
//			else
//			{
//				pre += k;
//			}
//		}
//		sum += pre;
//		num++;
//	}
//	int ss = 0;
//	int i = 0;
//	for (i = 0; i < v.size() / 2; i++)
//	{
//		if (v[i] == 1 && v[i + 1] == 1 && v[i + 2] == 1)
//			ss++;
//	}
//	cout << sum << ' ' << tree << ' ' << ss;
//}
#include<iostream>
#include<vector>
#include<cstdio>
#include<string>
using namespace std;
typedef struct dot
{
	int R;
	int G;
	int B;
	dot(int a, int b, int c)
	{
		R = a;
		G = b;
		B = c;
	}
	dot()
	{
		R = G = B = 0;
	}
}dot;
dot defaultDot(0, 0, 0);
dot arr[1100][2000];
vector<dot> list;
int m, n,  p, q;
int toAscii(char ch)
{
	if (ch >= 'a')
		return ch - 'a' + 10;
	else
		return ch - '0';
}
dot strToDot(string s)
{
	s.erase(0,1);
	dot d;
	if (s.length() == 6)
	{
		d.R = toAscii(s[0]) * 16 + toAscii(s[1]);
		d.G = toAscii(s[2]) * 16 + toAscii(s[3]);
		d.B = toAscii(s[4]) * 16 + toAscii(s[5]);
	}
	else if (s.length() == 3)
	{
		d.R = toAscii(s[0]) * 16 + toAscii(s[0]);
		d.G = toAscii(s[1]) * 16 + toAscii(s[1]);
		d.B = toAscii(s[2]) * 16 + toAscii(s[2]);
	}
	else
	{
		d.R = toAscii(s[0]) * 16 + toAscii(s[0]);
		d.G = toAscii(s[0]) * 16 + toAscii(s[0]);
		d.B = toAscii(s[0]) * 16 + toAscii(s[0]);		
	}
	return d;
}
dot countDot(int r, int edr, int c, int edc)
{
	dot d;
	int i, j;
	for (i = r; i < edr; i++)
	{
		for (j = c; j < edc; j++)
		{
			d.R += arr[i][j].R;
			d.G += arr[i][j].G;
			d.B += arr[i][j].B;
		}
	}
	int area = (edr - r) * (edc - c);
	d.B /= area;
	d.G /= area;
	d.R /= area;
	return d;
}
void outputDefaultRGB()
{
	printf("\\x1B\\x5B\\x30\\x6D");
}
int isEqual(dot a, dot b)
{
	return (a.R == b.R && a.G == b.G && a.B == b.B);
}
void outputSpace()
{
	printf("\\x20");
}
void outputNumber(int num)
{
	int i = 0;
	string s = to_string(num);
	for (i = 0; i < s.size(); i++)
	{
		int k = int(s[i]);
		printf("\\x");
		printf("%X", k);
	}
}
void outputStringRGB(dot cur)
{
	printf("\\x1B\\x5B\\x34\\x38\\x3B\\x32\\x3B"); 
	outputNumber(cur.R);
	printf("\\x3B");
	outputNumber(cur.G);
	printf("\\x3B");
	outputNumber(cur.B);
	printf("\\x6D\\x20");
}
void outputRGB()
{
	int group = m / p;
	int i;
	dot pre;
	dot cur;
	for (i = 0; i < list.size(); i++)
	{
		cur = list[i];
		if (i % group == 0)
			pre=defaultDot;
		if (isEqual(cur, pre))
			outputSpace();
		else if (isEqual(cur, defaultDot))
		{
			outputDefaultRGB();
			outputSpace();
		}
		else
		{
			outputStringRGB(cur);
		}
		if ((i + 1) % group == 0 && !isEqual(cur, defaultDot))
			outputDefaultRGB();
		if ((i + 1) % group == 0)
			printf("\\x0A");
		pre = cur;
	}
}
int main()
{
	cin >> m >> n;
	cin >> p >> q;
	int i, j;
	for (int i = 1; i <= n; i++)
	{
		for (j = 1; j <= m; j++)
		{
			string s;
			cin >> s;
			arr[i][j] = strToDot(s);
		}
	}
	j = 1;
	i = 1;
	while(i<=n)
	{
		dot t = countDot(i, i + q, j, j + p);
		list.push_back(t);
		j += p;
		if (j > m)
		{
			j = 1;
			i += q;
		}
	}
	outputRGB();
}

